package cc.owoo.godpen.thread;

/**
 * 同步任务线程
 * Created by nimensei
 * 2022-03-21 下午 09:09
 **/
public class SyncThreadPool {
    private final Object lock = new Object();//线程锁
    private int count;// 最大线程数
    private int now;//当前线程数

    public SyncThreadPool(int count) {
        setMaxThreadCount(count);
    }

    /**
     * 设置最大线程数
     *
     * @param count 最大线程数
     */
    public void setMaxThreadCount(int count) {
        if (count <= 0)
            throw new IllegalArgumentException("线程数不能小于1：" + count);
        this.count = count;
    }

    /**
     * 获取最大线程数
     *
     * @return 最大线程数
     */
    public int getMaxThreadCount() {
        return count;
    }

    /**
     * 获取当前线程池数量
     *
     * @return 当前线程池数量
     */
    public int getNowThreadCount() {
        return now;
    }

    /**
     * 执行
     *
     * @param runnable 回调函数
     */
    public void execute(Runnable runnable) {
        while (now >= count)
            Threads.delay(10);
        synchronized (lock) {
            ++now;
        }
        Threads.run(() -> executeTask(runnable));
    }

    /**
     * 执行任务
     *
     * @param runnable 任务回调函数
     */
    private void executeTask(Runnable runnable) {
        runnable.run();
        synchronized (lock) {
            --now;
        }
    }

    /**
     * 等待线程全部结束
     */
    public void awaitFinish() {
        while (now != 0)
            Threads.delay(10);
    }
}

